home *** CD-ROM | disk | FTP | other *** search
/ The Games Machine 76 / XENIATGM66.iso / Indiana Jones / Indiana Jones.exe / RESOURCE / PREVIEW.GOB / cog_pyr_runawaykid.cog < prev    next >
Text File  |  1999-11-15  |  7KB  |  289 lines

  1. # Jones 3D Cog Script
  2. #
  3. # pyr_runawaykid.cog
  4. #    
  5. # Make kid disappear into hole when threatened
  6. #
  7. # [RKD]
  8. #
  9. # (C) 1999 LucasArts Entertainment Company LLC. All Rights Reserved
  10. # ========================================================================================
  11.  
  12. symbols
  13.  
  14. message    startup
  15. message    entered
  16. message    exited
  17. message    damaged
  18. message    timer
  19. message arrived
  20. message blocked
  21. message user1
  22.  
  23. thing    t_Kid            mask=0x409
  24.  
  25. thing    kidmarkout    nolink
  26. thing    kidmarkin    nolink
  27.  
  28. sector    s_Trigger        mask=0x40D
  29. # =============================== Misc Stuff =================================================
  30.  
  31. int        b_IndyNearEntrance=0           local
  32. int        b_HyenasOutside=0            local
  33. flex    f_InsideTime                local
  34. thing    t_Thing                        local
  35.  
  36. # =============================== Kid's Stuff =================================================
  37. int        n_KidStatus                        local
  38.  
  39. int    KID_STATUS_NO_LONGER_IN_HOLE=-1        local
  40. int    KID_STATUS_INSIDE=0                    local
  41. int    KID_STATUS_HEADING_INSIDE=1            local
  42. int    KID_STATUS_OUTSIDE=2                local
  43. int    KID_STATUS_HEADING_OUTSIDE=3        local
  44. int    KID_STATUS_BLOCKED=4                local
  45.  
  46. int STAY_INSIDE_AFTER_THIS_MANY_HYENAS_DIE=8 local
  47.  
  48. int    MAX_NUM_HYENAS=11                    local
  49.  
  50. # ============================= Timer Stuff =================================================
  51. int    TIMER_ID_SEND_KID_OUT=0                local
  52. int TIMER_ID_UPDATE_TRACKING=1            local
  53.  
  54. flex TRACKING_UPDATE_TIME=5.0            local
  55.  
  56. flex MIN_INSIDE_TIME=20.0                local
  57. flex VARIABLE_INSIDE_TIME=20.0            local
  58.  
  59. int     n_TimerID                            local
  60.  
  61. # ============================== Subroutines ==========================================================
  62. flex    SendKidInside            local
  63. flex    SendKidOutside            local
  64. flex     SendKidOutsideDelayed     local
  65. flex    CheckForHyenasOutside     local
  66.  
  67. end
  68.  
  69. code
  70.  
  71. # ========================================================================================
  72. startup:
  73.     n_KidStatus = KID_STATUS_INSIDE;
  74.     sleep(.01);
  75.     
  76.     # RKD: delaying kid to help framerate at beginning
  77.     SetTimerEx(45.0, TIMER_ID_SEND_KID_OUT, 0, 0);
  78.     Sleep(40);
  79.     ClearThingFlags(t_Kid, 0x80000);
  80.     AISetCutSceneMode(t_Kid);
  81.     return;
  82.     
  83. # ========================================================================================
  84. damaged:
  85.     // If kid takes damage he must flee inside    
  86.  
  87.     if (GetSenderRef() != t_Kid)
  88.     {
  89.         return;
  90.     }
  91.  
  92.     call SendKidInside;
  93.  
  94.     return;
  95.  
  96. # ========================================================================================
  97. entered:
  98.     // If Indy, an AI or a weapon enters sector in front of hole then send kid back inside
  99.     if (GetSenderRef() == s_Trigger)
  100.     {
  101.         if (GetSourceRef() == GetLocalPlayerThing())
  102.         {
  103.             call SendKidInside;
  104.             b_IndyNearEntrance = 1;
  105.         }
  106.         else if(GetThingType(GetSourceRef()) == 2) // Actor
  107.         {
  108.             if (IsThingModelName(GetSourceRef(), "gen_hy.3do"))
  109.             {
  110.                 call SendKidInside;
  111.             }
  112.         }
  113.         else if (GetThingType(GetSourceRef()) == 3) // Weapon
  114.         {
  115.             call SendKidInside;
  116.         }
  117.     }
  118.  
  119.     return;
  120.  
  121. # ========================================================================================
  122. exited:
  123.     // Once Indy leaves area in front of hole. Attempt to send kid back out
  124.     if ( (GetSourceRef() == GetLocalPlayerThing())
  125.           && (GetSenderRef() == s_Trigger)
  126.           )
  127.     {
  128.         b_IndyNearEntrance = 0;
  129.     }
  130.  
  131.     return;
  132.  
  133. # ========================================================================================
  134. timer:
  135.     n_TimerID = GetSenderID();
  136.  
  137.     if (n_TimerID == TIMER_ID_SEND_KID_OUT)
  138.     {
  139.         call SendKidOutside;
  140.     }
  141.     else if (n_TimerID == TIMER_ID_UPDATE_TRACKING)
  142.     {
  143.         if (n_KidStatus == KID_STATUS_OUTSIDE)
  144.         {
  145.             AIEnableHeadTracking(t_Kid, GetLocalPlayerThing());
  146.             AIEnableBodyTracking(t_Kid, GetLocalPlayerThing());
  147.             SetTimerEx(TRACKING_UPDATE_TIME, TIMER_ID_UPDATE_TRACKING, 0, 0);
  148.         }
  149.     }
  150.  
  151.     return;
  152.  
  153. # ========================================================================================
  154. blocked:
  155.     if (n_KidStatus != KID_STATUS_NO_LONGER_IN_HOLE)
  156.     {
  157.         n_KidStatus = KID_STATUS_BLOCKED;
  158.         call SendKidInside;
  159.     }
  160.     return;
  161.  
  162.  
  163. # ========================================================================================
  164. arrived:
  165.     if (n_KidStatus == KID_STATUS_HEADING_INSIDE)
  166.     {
  167.  
  168.         // Hide the boy
  169.         n_KidStatus = KID_STATUS_INSIDE;
  170.         SetThingFlags(t_Kid, 0x10);    
  171.         SetThingFlags(t_Kid, 0x80000);
  172.         call SendKidOutsideDelayed;
  173.     }
  174.     else if (n_KidStatus == KID_STATUS_HEADING_OUTSIDE)
  175.     {
  176.         n_KidStatus = KID_STATUS_OUTSIDE;
  177.         SetTimerEx(0.1, TIMER_ID_UPDATE_TRACKING, 0, 0);
  178.     }
  179. #    else
  180. #    {
  181. #        DebugFlex(n_KidStatus, "PYR_runawaykid.cog: Bad Kid Status on Arrived Message");
  182. #    }
  183.     
  184.     return;
  185.  
  186. # ========================================================================================
  187. // User1 means that a Hyena has died
  188. User1:
  189.     if (global8 >= STAY_INSIDE_AFTER_THIS_MANY_HYENAS_DIE)
  190.     {
  191.         call SendKidInside;
  192.     }
  193.  
  194.     if (global8 >= MAX_NUM_HYENAS)
  195.     {
  196.         n_KidStatus = KID_STATUS_NO_LONGER_IN_HOLE;
  197.     }
  198.  
  199.     return;
  200.  
  201. # ========================================================================================
  202. SendKidInside:
  203.  
  204.     if ( (n_KidStatus == KID_STATUS_OUTSIDE)
  205.          || (n_KidStatus == KID_STATUS_HEADING_OUTSIDE)
  206.          || (n_KidStatus == KID_STATUS_BLOCKED)
  207.          )
  208.     {
  209.         n_KidStatus = KID_STATUS_HEADING_INSIDE;
  210.  
  211.         AIDisableHeadTracking(t_Kid);
  212.         AIDisableBodyTracking(t_Kid);
  213.     
  214.         AISetMoveSpeed(t_Kid, 6);
  215.         AISetLookThing(t_Kid, kidmarkin);
  216.         AISetMoveThing(t_Kid, kidmarkin, 0);
  217.     }
  218.  
  219.     return;
  220.  
  221. # ========================================================================================
  222. SendKidOutside:
  223.     
  224.     # Once most of hyenas are dead the kid no longer comes outside.
  225.     # Supposedly to give him time to run to another part of level
  226.     if (global8 >= STAY_INSIDE_AFTER_THIS_MANY_HYENAS_DIE)
  227.     {
  228.         return;
  229.     }
  230.     
  231.     call CheckForHyenasOutside;
  232.  
  233.     if ( (n_KidStatus == KID_STATUS_INSIDE)
  234.          && !b_IndyNearEntrance
  235.          && !b_HyenasOutside
  236.          && (global3 != 4)    # kid is in mid-cutscene
  237.          )
  238.     {
  239.         n_KidStatus = KID_STATUS_HEADING_OUTSIDE;
  240.  
  241.         ClearThingFlags(t_Kid, 0x80000);
  242.         ClearThingFlags(t_Kid, 0x10);
  243.  
  244.         AISetMoveSpeed(t_Kid, 1);
  245.         AISetLookThing(t_Kid, kidmarkout);
  246.         AISetMoveThing(t_Kid, kidmarkout, 0);
  247.     }
  248.     else if ( (n_KidStatus != KID_STATUS_OUTSIDE)
  249.               && (n_KidStatus != KID_STATUS_HEADING_OUTSIDE)
  250.               )
  251.     {
  252.         # Try again later
  253.         call SendKidOutsideDelayed;
  254.     }
  255.  
  256.     return;
  257.  
  258.  
  259. # ========================================================================================
  260. SendKidOutsideDelayed:
  261.     f_InsideTime = MIN_INSIDE_TIME + (Rand() * VARIABLE_INSIDE_TIME);
  262.     SetTimerEx(f_InsideTime, TIMER_ID_SEND_KID_OUT, 0, 0);
  263.  
  264.     return;
  265.  
  266.  
  267. # ========================================================================================
  268. CheckForHyenasOutside:
  269.     b_HyenasOutside = 0;
  270.  
  271.     t_Thing = FirstThingInSector(s_Trigger);
  272.     while (t_Thing != -1)
  273.     {
  274.         if (GetThingType(t_Thing) == 2) // Actor?
  275.         {
  276.             if (IsThingModelName(t_Thing, "gen_hy.3do"))
  277.             {
  278.                 b_HyenasOutside = 1;
  279.                 return;
  280.             }
  281.         }
  282.  
  283.         t_Thing = NextThingInSector(t_Thing);
  284.     }
  285.  
  286.     return;
  287.  
  288. end
  289.